package com.example.demo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Controller;

@Controller
@Aspect         //标识当前类为切面
public class LogAOP {

    //定义切点(设置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.TestController.*(..))")
    public void pointcut() {
    }

    //前置通知
    @Before("pointcut()")
    public void before() {
        System.out.println("执行了前置通知!");
    }

    @After("pointcut()")//参数代表了这个通知被哪个切点所调用
    public void after() {
        System.out.println("执行了后置通知");
    }

    //环绕通知
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) {
        //目标方法的前置通知业务代码
        Object object = null;
        System.out.println("环绕通知的前置执行方法");

        try {
            //拦截的目标方法执行.
            joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }

        System.out.println("环绕通知的后置执行方法");
        return object;
    }
}